繼 Day8 的內容,我們可以透過 admin 在後台方便地管理資料
除此之外,我們也可以透過 Shell 來管理這一些資料,因為一旦我們創建好了這些資料模型(Models),Django便會提供我進行 Create、Retrieve、Update及Delete 的方式來操作資料庫,也就是所謂的CRUD
正確來說是 Create、Read、Update及Delete,但是 Retrieve 跟 Read 想要表達的意思其實很相近,因此只要了解CRUD主要涵義就是 新增、讀取、更新、刪除 就好
進入 Shell 操作 資料庫的方式也很簡單,鍵入 py manage.py shell
,便能夠進入 Python Shell
接著我們把 Models.py 的類別 Vendor 及 Food 引用進來from vendor.models import Food, Vendor
之後你就可以開始操作 vendor app 的資料庫囉!
此時先下 Vendor.objects.all()
,因為我們的資料庫目前是空的,你便能夠觀察它會回傳一個空的資料庫 <QuerySet []>
>>> Vendor.objects.all()
<QuerySet []>
而新增一筆 Vendor 資料有兩種方法
vendor = Vendor(vendor_name = "Alex", store_name="xelAshop", phone_number="09236", address='xs')
vendor.save()
or
vendor = Vendor.objects.create(vendor_name = "Alex", store_name="xelAshop", phone_number="09236", address='xs')
之後再輸入一次 Vendor.objects.all()
,就可以看到多了一筆資料,而我們也可以透過鍵值(Key)
來取得相對應的值(Value)
>>> Vendor.objects.all()
<QuerySet [<Vendor: Vendor object (1)>]>
>>> vendor = Vendor.objects.get(id=1) # 取得第一筆資料
>>> vendor.vendor_name # 相對應的鍵值
'Alex'
>>> vendor.store_name
'xelAshop'
>>> vendor.address
'xs'
>>> vendor.phone_number
'09236'
若是想要**修改(Update)**某一筆資料,也可以透過類似的方法修改
# 將 vendor_name 是 Alex 的資料欄位中的 address 改成 Kao
Vendor.objects.filter(vendor_name = "Alex").update(address = 'Kao')
filter 顧名思義就是過濾的功能,根據後方我們所填入的 字典(Dict),來一一過濾,修改完畢再存取一次,你便能發現資料已經成功被修改了^^
>>> vendor = Vendor.objects.get(id=1)
>>> vendor.address
'Kao'
這裡我們新增一個食物(突然很想吃馬芬)至剛剛建立好的攤販vendor,便可以發現food成功關聯到vendor
>>> food = Food.objects.create(food_name='馬芬', price_name='45', food_vendor = vendor)
>>> food.food_vendor
<Vendor: Vendor object (1)>
>>> food.food_vendor.vendor_name
'Alex'
>>> food.food_vendor.store_name
'xelAshlp'
而 刪除(Delete) 相對簡單,只要將愈刪除的資料讀取進來,再後方加上**.delete()**即可
# 這裡只是示意,並沒有進行刪除的動作
Food.objects.get(id=1).delete()
最後我們到admin查看一下剛建立好的資料,顯示出來的就跟我們上面所說的一樣 ^^
小結 : Django 提供一個強大的 CRUD,看似很複雜,但實際上相當容易! 只要稍微操作一下,相信大家很快就會熟練的
能夠直接下SQL指令嗎?
Django 有方法可以應用SQL指令,
[someclass].objects.raw([SQL COMMAND])
指令如下
>>> for name in Vendor.objects.raw('SELECT * FROM vendor_vendor'):
... print(name)
Alex
比較tricky的是撰寫 table 的格式為 [someapp]_[someclass]
因此我這裡才是用 from vendor_vendor